08. Arm Mover

Arm Mover

You’ve written your first ROS C++ node! This was no trivial task. You’ve had to learn quite a few things to get to this point.

But before we rush off, we have more ground to cover:

  • Custom message generation
  • Services
  • Parameters
  • Launch Files

In order to gain an understanding of the above, you will write another node called arm_mover .

Description of Arm Mover

In many respects, arm_mover is quite similar to simple_mover . Like simple_mover , it is responsible for commanding the arm to move. However, instead of simply commanding the arm to follow a predetermined trajectory, the arm_mover node provides the service safe_move , which allows other nodes in the system to send movement_commands .

In addition to allowing movements via a service interface, arm_mover also allows for configurable minimum and maximum joint angles, by using parameters.

Creating a new service definition

An interaction with a service consists of two messages. A node passes a request message to the service, and the service returns a response message to the node. The definitions of the request and response message types are contained within .srv files living in the srv directory under the package’s root.

Let’s define a new service for simple_arm . We shall call it GoToPosition .

$ cd /home/workspace/catkin_ws/src/simple_arm/
$ mkdir srv
$ cd srv
$ gedit GoToPosition.srv

You should now edit GoToPosition.srv with gedit, so it contains the following:

float64 joint_1
float64 joint_2
---
string msg_feedback

Service definitions always contain two sections, separated by a ‘---’ line. The first section is the definition of the request message. Here, a request consists of two float64 fields, one for each of simple_arm ’s joints. The second section contains the service response. The response contains only a single field, msg_feedback. The msg_feedback field is of type string, and is responsible for indicating that the arm has moved to a new position.

Note: Defining a custom message type is very similar. The only differences is that message definitions live within the msg directory of the package root, have a .msg extension, and do not contain the --- section divider. You can find more detailed information on creating messages and services on the ROS wiki.

Modifying CMakeLists.txt

As a reminder, in order for catkin to generate the C++ libraries which allow you to utilize messages in your code you must modify simple_arm ’s CMakeLists.txt file. You can find this file in /home/workspace/catkin_ws/src/simple_arm/ .

First, uncomment the add_service_files() macro so it looks like this:

add_service_files(
   FILES
   GoToPosition.srv
)

This tells catkin to add the newly created service file.

Then, make sure that the generate_messages() macro is uncommented:

generate_messages(
   DEPENDENCIES
   std_msgs  # Or other packages containing msgs
)

This macro is actually responsible for generating the code.

To force ROS to compile your C++ code with C++ 11 include this line of code:

add_compile_options(-std=c++11)

Modifying package.xml

Now that you have updated the CMakeLists.txt file, there’s one more file which needs to be modified: package.xml .

package.xml is responsible for defining many of the package’s properties, such as the name of the package, version numbers, authors, maintainers, and dependencies.

Right now, we’ll focus on the dependencies. You already learned about build-time dependencies and run-time package dependencies. When rosdep is searching for these dependencies, it’s the package.xml file that is being parsed. So make sure that the message_generation build dependency and the message_runtime run dependency exist in package.xml .

  <buildtool_depend>catkin</buildtool_depend>
  <build_depend>message_generation</build_depend>

  <run_depend>controller_manager</run_depend>
  <run_depend>effort_controllers</run_depend>
  <run_depend>gazebo_plugins</run_depend>
  <run_depend>gazebo_ros</run_depend>
  <run_depend>gazebo_ros_control</run_depend>
  <run_depend>joint_state_controller</run_depend>
  <run_depend>joint_state_publisher</run_depend>
  <run_depend>robot_state_publisher</run_depend>
  <run_depend>message_runtime</run_depend>
  <run_depend>xacro</run_depend>

For more information about package.xml , check out the ROS Wiki .

Checking Service with ROS

Now that you’ve created your GoToPosition service file, let's make sure that ROS can see it using the rossrv show command:

$ cd /home/workspace/catkin_ws/
$ source devel/setup.bash
$ rossrv show GoToPosition

You will see:

[simple_arm/GoToPosition]:
float64 joint_1
float64 joint_2
---
string msg_feedback

This indicates that ROS can see your service.

Great job, you accomplished so much in this lesson! First you created the GoToPosition.srv file. Then, you’ve added its dependencies in CMakeLists.txt . In addition, you checked for the build and run dependencies in package.xml . Lastly, you checked if ROS can see your service file. Now, let’s move onto the code for arm_mover .